﻿using System;
using System.Collections.Generic;
using System.Text;
using Mighty.Common;
using System.Collections;

namespace Mighty.Brain
{

    public class HyoBrain : BasicBrain
    {


        // 무늬별 나의 카드 뭉치들 
        ArrayList cloverCards;
        ArrayList diamondCards;
        ArrayList spadeCards;
        ArrayList heartCards;
        bool haveJoker = false; // 조커 유무
        bool haveClover3 = false; // 조커콜 유뮤
        bool haveSpadeA = false;    // 스페이드A 유무
 




        /* 게임 시작 전 초기화 */

        public override void GameStartEvent()
        {


            haveJoker = false;
            haveClover3 = false;
            haveSpadeA = false;
        }






        /* 배팅 전에 내 카드 정리 */

        public override void BettingReadyEvent()
        {


            // 각 무늬별 카드 뭉치
            cloverCards = new ArrayList();
            diamondCards = new ArrayList();
            spadeCards = new ArrayList();
            heartCards = new ArrayList();


            // 무늬별로 카드분리 하기
            foreach (HandedCard card in gameInfo.myCards)
            {
                switch (card.shape)
                {
                    case Shape.Clover:
                        if (card.number == 3) haveClover3 = true;
                        else cloverCards.Add(card);                        
                        break;
                    case Shape.Diamond:
                        diamondCards.Add(card);
                        break;
                    case Shape.Spade:
                        if (card.number == 14) haveSpadeA = true;
                        else spadeCards.Add(card);
                        break;
                    case Shape.Heart:
                        heartCards.Add(card);
                        break;
                    case Shape.Joker:
                        haveJoker = true;
                        break;

                }

            }

        }






        /* 무늬별 배팅 할까말까 지수 정하기 */

        public int bettingScore(Shape nowShape, ArrayList nowCards)
        {
                 
            int cardNum = nowCards.Count;
            if (haveJoker == true) cardNum += 1;
            else if (nowShape != Shape.Spade && haveSpadeA == true) cardNum += 1;

            // 무늬별 카드가 4장 미만이면 0점으로 계산.(조커, 마이티 포함)
            if (cardNum < 4) return 0;

            int nowBettingScore = 0; // 배팅 할까말까 지수


            // 카드 하나씩 배팅 할까말까 지수 매기기 
            foreach (Card card in nowCards)
            {
                switch (card.number)
                {
                    case 14: // A
                        nowBettingScore += 4;
                        break;
                    case 13: // K
                    case 12: // Q
                        nowBettingScore += 3;
                        break;
                    case 11: // J
                        nowBettingScore += 2;
                        break;
                    default:
                        nowBettingScore += 1;
                        break;
                }

            }

            if (haveJoker == true) nowBettingScore += 4;
            if (haveClover3 == true && nowShape != Shape.Clover) nowBettingScore += 1;
            if (haveSpadeA == true && nowShape != Shape.Spade) nowBettingScore += 5;

            return nowBettingScore;
        }






        /* 내 배팅 결정 */

        public override Betting BettingTicEvent()
        {
            Betting betting = new Betting();


            betting.isPass = true;

            int nowScore = 0; // 현재
            int highestScore = 0;

            Shape nowShape = 0;
            ArrayList nowCards = new ArrayList();

            // 가장 높은 배팅 할까말까 지수 찾기
            for(int i=0; i<4 ; i++)
            {

                switch (i)
                {
                    case 0:
                        nowCards = cloverCards;
                        nowShape = Shape.Clover;
                        break;
                    case 1:
                        nowCards = diamondCards;
                        nowShape = Shape.Diamond;
                        break;
                    case 2:
                        nowCards = spadeCards;
                        nowShape = Shape.Spade;
                        break;
                    case 3:
                        nowCards = heartCards;
                        nowShape = Shape.Heart;
                        break;
                }


                nowScore = bettingScore(nowShape, nowCards);
                if (nowScore > highestScore)
                {
                    highestScore = nowScore;
                    betting.giruda = (Giruda) i;
                }

            }

            // 내 배팅 한도 정하기
            int nowLimit = 0;

            if (highestScore < 10) nowLimit = 0;
            else if (highestScore >= 10 && highestScore <= 12) nowLimit = 13;
            else if (highestScore > 12 && highestScore < 14) nowLimit = 14;
            else if (highestScore >= 14 && highestScore <= 17) nowLimit = 15;
            else if (highestScore > 17 && highestScore < 19) nowLimit = 16;
            else nowLimit = 17;


            // 누군가가 배팅을 했을 경우
            if (gameInfo.betting.limit > 0)
            {
                Betting previousBetting = (Betting)gameInfo.bettingHistory[gameInfo.bettingHistory.Count - 1];


                // 내 카드의 배팅 한도보다 현재 배팅 한도가 작으면 배팅한다
                if (previousBetting.limit < nowLimit)
                {                    
                    betting.isPass = false; 
                    betting.limit = previousBetting.limit + 1;
                }
            }
            else // 아직 아무도 배팅한 사람이 없을 경우
            {
                if (nowLimit != 0)
                {
                    betting.isPass = false;

                    if (nowLimit == 14)
                        betting.limit = 14;
                    else if (nowLimit > 14)
                        betting.limit = 15;
                    else betting.limit = 13;
                }
            }
            return betting;
        }






        /* 라운드별 카드 내기 */

        public override HandedCard RoundTicEvent()
        {
            ArrayList possibleCards = new ArrayList();

            // 낼 수 있는 카드 골라내기
            foreach (HandedCard card in gameInfo.myCards)
            {
                if (card.isPossible) possibleCards.Add(card);
            }

            Random r = new Random();
            int k = r.Next(possibleCards.Count);

            return (HandedCard)possibleCards[k];
        }







    }
}
